import crypto from "crypto-js";

export class uploadOssHelper {
    accessKeyId: string = "";
    accessKeySecret: string = "";
    timeout: number;
    maxSize: number;
    constructor(options: {
        accessKeyId: string, 
        accessKeySecret: string,
        timeout?: number,
        maxSize?: number
    }) {
        this.accessKeyId = options.accessKeyId;
        this.accessKeySecret = options.accessKeySecret;
        // 限制参数的生效时间，单位为小时，默认值为1。
        this.timeout = options.timeout || 1;
        // 限制上传文件的大小，单位为MB，默认值为10。
        this.maxSize = options.maxSize || 10;
    }

    createUploadParams() {
        const policy = this.getPolicyBase64();
        const signature = this.signature(policy);
        return {
            OSSAccessKeyId: this.accessKeyId,
            policy: policy,
            Signature: signature,
        };
    }

    getPolicyBase64() {
        let date = new Date();
        // 设置policy过期时间。
        date.setHours(date.getHours() + this.timeout);
        let srcT = date.toISOString();
        const policyText = {
            expiration: srcT,
            conditions: [
                // 限制上传文件大小。
                ["content-length-range", 0, this.maxSize * 1024 * 1024],
            ],
        };
        const buffer = new Buffer(JSON.stringify(policyText));
        return buffer.toString("base64");
    }

    signature(policy: string) {
        return crypto.enc.Base64.stringify(
            crypto.HmacSHA1(policy, this.accessKeySecret)
        );
    }
}